#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 电影名称长度
#define FILMNAME_LEN 30

/**
 * @brief Item表示了单个电影对象,movie结构:包含定影名称movie_name和评分rating
 */
struct movie
{
    char title[FILMNAME_LEN];
    float rating;
};
typedef struct movie Item;

/**
 * @brief node链表形式
 */

struct node
{
    Item item;
    struct node *next;
};
typedef struct node Node;

/**
 * @brief List是Node链表的几何形式
 */
typedef Node *List;

/**
 * @brief 初始化一个链表,plist链表初始化为空
 * @param plist 指向一个链表
 */
void InitializeList(List *plist);

/**
 * @brief 判断list是不是空的
 *
 * @param plist 传入的list的指针参数
 * @return true 是空的
 * @return false  不是空的
 */
bool ListIsEmpty(const List *plist);

/**
 * @brief 判断list是不是满的
 *
 * @param plist 传入的list的指针的参数
 * @return true 是满的
 * @return false 不是满的
 */
bool ListIsFull(const List *plist);

/**
 * @brief 返回一个unsigned int值,表示List结构中的数量
 *
 * @param plist 传入的list指针的参数
 * @return unsigned int
 */
unsigned int ListItemCount(const List *plist);

/**
 * @brief 添加一个Item到指定的list
 *
 * @param item movie对象
 * @param plist 指定的list
 * @return true 成功
 * @return false 失败
 */
bool AddItem(Item item, List *plist);

/**
 * @brief 把函数作用于链表中的每一项
 *
 * @param plist 指定的链表
 * @param pfunction 一个指定类型的函数 void(*pfunc)(Item item)
 */
void Traverse(const List *plist, void (*pfunction)(Item item));

/**
 * @brief 清空List中的所有数据
 *
 * @param plist 传入的List参数
 */
void EmptyTheList(List *plist);